import fs from 'fs';
import path from 'path';
import { component, story, test, barrel, type } from './gen-component-template';

// Grab component name from terminal argument
const [name] = process.argv.slice(2);
if (!name) {
  throw new Error('You must include a component name.');
}

if (!name.match(/^[A-Z]/)) {
  throw new Error('Component name must be in PascalCase.');
}

const toKebabCase = (pascalCasedName: string) =>
  pascalCasedName
    .replace(/([A-Z][a-z])/g, '-$1') // Add a hyphen before each capital letter
    .toLowerCase()
    .substring(1); // Return the string but exclude the hyphen at the beginning

const kebabCasedName = toKebabCase(name);

const dir = path.join(__dirname, `../src/${kebabCasedName}`);

// Throw an error if the component's folder already exists
if (fs.existsSync(dir)) {
  throw new Error('A component with that name already exists.');
}

// Create the folder
fs.mkdirSync(dir);

const writeFileErrorHandler = (err: Error | null) => {
  if (err) {
    throw err;
  }
};

// Create the component file - my-component.tsx
fs.writeFile(
  `${dir}/${kebabCasedName}.tsx`,
  component(name),
  writeFileErrorHandler
);

// Create the type file - types.ts
fs.writeFile(`${dir}/types.ts`, type(name), writeFileErrorHandler);

// Create the test file - my-component.test.tsx
fs.writeFile(
  `${dir}/${kebabCasedName}.test.tsx`,
  test(name),
  writeFileErrorHandler
);

// Create the Storybook file - my-component.stories.tsx
fs.writeFile(
  `${dir}/${kebabCasedName}.stories.tsx`,
  story(name),
  writeFileErrorHandler
);

// Create the barrel file - index.ts
fs.writeFile(
  `${dir}/index.ts`,
  barrel(name, kebabCasedName),
  writeFileErrorHandler
);

console.log(`The ${name} component has been created successfully! 🎉`);
